package QianFeng07.IODemo2.NIO;

import java.io.File;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.nio.file.*;
import java.util.stream.Stream;

/**
 * JDK1.7新的文件操作类：
 * Path接口、Paths类、Files类
 *
 * Path接口
 * 1、Path表示的是一个目录名序列，其后还可以跟着一个文件名，路径中第一个部件是根部件时就是
 *      绝对路径，例如/或C:\，而允许访问的根部件取诀于文件系统;
 * 2、以根部件开始的路径是绝对路径，否则就是相对路径;
 * 3、静态的Paths.get方法接受一个或多个字符串，字符串之间自动使用默认文件系统的路径分隔符连接
 * 起来(Unix是 /, Windows是 \)，这就解决了跨平台的问题，接着解析连接起来的结果，如果不
 * 是合法路径就抛出InvalidPathException异常，否则就返回一个Path对 象;
 **/
public class PathFilesDemo {
    public static void main(String[] args) {
        File file = new File("F:\\Test\\my\\1.jpg");

        /*得到path的三个方法*/
        System.out.println("--------------------得到Path三个方法--------------------");
        //1
        Path p1 = Paths.get("F:\\Test\\my", "1.jpg");
        System.out.println(p1);
        //2
        Path p2 = file.toPath();
        System.out.println(p2);
        //3
        FileSystems.getDefault().getPath("F:\\Test\\my", "1.jpg");

        /*Files工具类*/
        System.out.println("--------------------Files工具类--------------------");
        Path p4 = Paths.get("F:\\Test\\test.txt");

        //写文件
        String info = "村花到我家，一起玩...";
        try {
            Files.write(p4, info.getBytes(StandardCharsets.UTF_8), StandardOpenOption.APPEND);
        } catch (IOException e) {
            e.printStackTrace();
        }

        //读文件
        byte[] bytes;
        try {
            bytes = Files.readAllBytes(p4);
            System.out.println(new String(bytes));
        } catch (IOException e) {
            e.printStackTrace();
        }

        //复制文件
        try {
            Files.copy(p4, Paths.get("F:\\Test\\copy\\test1.txt"), StandardCopyOption.REPLACE_EXISTING);
            System.out.println("copy success!");
        } catch (IOException e) {
            e.printStackTrace();
        }

        //移动文件
        try {
            Files.move(p4, Paths.get("F:\\Test\\move\\test1.txt"), StandardCopyOption.REPLACE_EXISTING);
            System.out.println("move success!");
        } catch (IOException e) {
            e.printStackTrace();
        }

        //删除文件
        Path p5 = Paths.get("F:\\Test\\copy","test.txt");
        try {
            Files.delete(p5);// static bool deleteIfExists(Path path)  path不存在抛出异常用这个更好
            System.out.println("delete success!");
        } catch (IOException e) {
            e.printStackTrace();
        }

        //创建新目录，除了最后一个部件，其他必须是已经存在的
        try {
            Files.createDirectories(Paths.get("F:\\Test\\Test1"));
        } catch (IOException e) {
            e.printStackTrace();
        }

        //创建路径中的中间目录，能创建不存在的中间部件
        try {
            //Test2目录和其下的test都是不存在的目录
            Files.createDirectories(Paths.get("F:\\Test\\Test2\\test"));
        } catch (IOException e) {
            e.printStackTrace();
        }

        //创建一个空文件，检查文件存在，如果已存在则抛出异常而检查文件存在是原子性的，
        //因此在此过程中无法执行文件创建操作
        try {
            Files.createFile(Paths.get("F:\\Test\\BB.txt"));
        } catch (IOException e) {
            e.printStackTrace();
        }

        //添加前/后缀创建临时文件或临时目录
        //Path newPath1 = Files.createTempFile(dir, prefix, suffix);//dir目录  prefix前缀  suffix后缀
        //Path newPath2 = Files.createTempDirectory(dir, prefix);

    }
}
